package libos

import (
	"bufio"
	"fmt"
	"io"
	"io/ioutil"
	"log"
	"os"
	"time"
)

//读取文件， 效率底下
func readFile(path string) {
	start := time.Now()
	file, err := os.Open(path) // For read access.
	if err != nil {
		log.Fatal(err)
	}
	data := make([]byte, 100)
	chunks := make([]byte, 1024, 1024)
	for {
		count, err := file.Read(data)
		if err != nil && err != io.EOF {
			panic(err)
		}
		if 0 == count {
			break
		}
		chunks = append(chunks, data[:count]...)
		//fmt.Printf("read %d bytes: %q\n", count, data[:count])
	}
	if err != nil {
		log.Fatal(err)
	}
	t1 := time.Now()
	fmt.Println("读取时间为:", t1.Sub(start))
	fmt.Printf(string(chunks))

}

func readFile2(path string) {
	start := time.Now()
	fi, err := os.Open(path)
	if err != nil {
		panic(err)
	}
	defer fi.Close()
	r := bufio.NewReader(fi)

	chunks := make([]byte, 1024, 1024)

	buf := make([]byte, 1024)
	for {
		n, err := r.Read(buf)
		if err != nil && err != io.EOF {
			panic(err)
		}
		if 0 == n {
			break
		}
		chunks = append(chunks, buf[:n]...)
	}
	t1 := time.Now()
	fmt.Println("读取时间为:", t1.Sub(start))
	fmt.Printf(string(chunks))
}

//效率最高
func readFile3(path string) {
	start := time.Now()
	fi, err := os.Open(path)

	if err != nil {
		panic(err)
	}
	defer fi.Close()
	fd, err := ioutil.ReadAll(fi)
	t1 := time.Now()
	fmt.Println("读取时间为:", t1.Sub(start))
	fmt.Printf(string(fd))
}

func OsMethod() {
	//Hostname返回内核提供的主机名。
	os.Truncate("./test.json", 64) //修改文件大小
	name, err := os.Hostname()
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("主机名:", name)

	//Getpagesize返回底层的系统内存页的尺寸。
	fmt.Println("内存页的尺寸:", os.Getpagesize())
	fmt.Println("环境变量:", os.Environ())
	fi, err := os.Stat("./test.json") //获取文件信息
	fmt.Println(fi.IsDir())
	fmt.Println(fi.Mode())
	fmt.Println(fi.ModTime())
	fmt.Println(fi.Name())
	fmt.Println(fi.Size())
	path, err := os.Getwd()
	fmt.Println("返回工作目录：", path)

	fmt.Println("保管临时文件的默认目录：", os.TempDir())

	reader, writer := io.Pipe()//Pipe返回一对关联的文件对象。从r的读取将返回写入w的数据。本函数会返回两个文件对象和可能的错误。
	inputData := []byte("1234567890ABCD")
	go writer.Write(inputData)
	outputData := make([]byte, 11)
	n, _ := reader.Read(outputData)
	fmt.Println(string(outputData))
	fmt.Println("read number", n)
	fmt.Println(string(outputData))

}
